6장. Low Latency를 가능하게 하는 구조
6.1 왜 데이터 구조까지 바뀌어야 했는가
5장에서 LL-HLS의 핵심은 “기다림을 줄이는 것”이었다.
segment를 더 작게 만들고, 데이터를 만드는 중간부터 전달하며, 요청을 기다리는 방식으로 바꾼다.
이 중 가장 중요한 변화는 이것이다.
완성된 파일이 아니라, 생성 중인 데이터를 전달한다
이걸 구현하려고 하면 기존 HLS에서 사용하던 .ts 구조가 맞지 않는다는 문제가 나온다.
즉 단순히 동작을 바꾸는 것이 아니라, 데이터를 담는 방식 자체가 바뀌어야 한다.
6.2 TS는 왜 중간 전송이 어려운가
TS는 방송 송출을 위해 만들어진 포맷이다.
파일이라기보다 “흘러가는 신호”에 가깝다.
구조를 보면 작은 패킷(188 byte)들이 계속 이어지는 형태다.
겉보기에는 잘게 쪼개져 있지만, 이 패킷들은 각각 독립적인 재생 단위가 아니다.
즉 이런 특징을 가진다.
- 데이터가 연속된 흐름으로 이어져 있음
- 특정 구간만 잘라서 바로 재생하기 어려움
- 디코딩 정보가 여러 구간에 걸쳐 존재함
그래서 이런 문제가 생긴다.
“지금 이 부분만 잘라서 바로 재생하자”가 어렵다.
결국 안정적으로 재생하려면 이렇게 된다.
segment 전체가 완성된 뒤에 전송해야 한다
중간에 보내면 재생이 깨지거나 디코딩이 실패할 수 있기 때문이다.
6.3 fMP4는 왜 가능한가
이 문제를 해결하기 위해 등장한 것이 fMP4 구조다.
핵심은 단순하다.
데이터를 “의미 있는 조각” 단위로 나눈다
fMP4는 다음과 같은 구조를 가진다.
init.mp4 (초기 정보)
moof + mdat ← 1번째 조각
moof + mdat ← 2번째 조각
moof + mdat ← 3번째 조각
...
여기서 중요한 포인트는 이것이다.
moof + mdat 하나가 “독립적인 재생 가능한 조각”이다
각 조각은
- 어떤 시간 구간인지 정보가 있고
- 그 구간의 영상 데이터가 포함되어 있으며
- 이 조각만으로도 디코딩이 가능하다
즉 앞 데이터를 몰라도 재생이 가능하다.
이 구조 때문에 가능한 변화가 생긴다.
- 전체 segment를 기다릴 필요 없음
- 조각 하나가 만들어지면
- 바로 전송 가능
즉 이렇게 바뀐다.
TS: 전체가 하나의 흐름
fMP4: 완전한 조각들이 이어진 구조
이 차이 때문에 Low Latency가 가능해진다.
“완성 후 전송”에서 “생성 중 전송”으로 전환
6.4 fMP4만으로는 부족했던 이유
여기까지 보면 fMP4로 모든 문제가 해결된 것처럼 보인다.
하지만 실제 서비스에서는 또 다른 문제가 생긴다.
각자 방식대로 쪼개기 시작하면 호환이 깨진다.
- 어떤 인코더는 0.5초 단위로 자르고
- 어떤 인코더는 1초 단위로 자르고
- 플레이어마다 지원 방식이 다르고
- HLS와 DASH 구조도 서로 다르다
즉 기술적으로는 가능하지만
실제 서비스에서는 혼란이 발생한다.
6.5 CMAF는 무엇을 해결했는가
이 문제를 해결하기 위해 등장한 것이 CMAF다.
중요한 포인트는 이것이다.
CMAF는 새로운 구조가 아니라
fMP4를 어떻게 사용할지 정의한 규칙이다
CMAF는 세 가지를 표준화한다.
첫 번째는 “쪼개는 단위“
데이터를 다음과 같은 계층으로 나눈다.
- Segment → 플레이어가 인식하는 단위
- Fragment → 내부 논리 단위
- Chunk → 실제 전송 단위
그리고 중요한 규칙을 만든다.
각 chunk는 독립적으로 디코딩 가능해야 한다
이 규칙 덕분에 중간부터 받아도 재생이 가능해진다.
두 번째는 “전송 방식”
과거에는 fMP4를 사용해도
segment 전체를 다 만든 뒤 보내는 경우가 많았다.
CMAF는 이렇게 정의한다.
chunk가 만들어지면 즉시 전송해야 한다
이때 사용하는 방식이 HTTP Chunked Transfer다.
즉 데이터가 파일처럼 한 번에 내려오는 것이 아니라
스트림처럼 계속 흘러오게 된다.
세 번째는 “호환성”
과거에는
- HLS용 fMP4
- DASH용 fMP4
구조가 달라 서로 호환되지 않았다.
CMAF는 이 구조를 통일한다.
그래서 하나의 fMP4 조각으로
- HLS에서도 재생 가능하고
- DASH에서도 재생 가능하다
즉 동일한 데이터를 여러 환경에서 그대로 사용할 수 있다.
6.6 전체 흐름 정리
지금까지의 흐름을 정리하면 이렇다.
HLS는 안정성을 위해 설계되었고
그 구조 때문에 지연이 발생했다.
이를 줄이기 위해 LL-HLS가 등장했고
“만들면서 전달하는 방식”이 필요해졌다.
하지만 TS 구조로는 이를 구현할 수 없었고
그래서 fMP4 구조가 도입되었다.
그리고 실제 서비스에서 사용할 수 있도록
CMAF가 이를 표준화했다.